package cn.fansunion.leecode.math;

import java.util.Calendar;
import java.util.Date;

/**
 * 一年中的第几天
 *给你一个字符串 date ，按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。

通常情况下，我们认为 1 月 1 日是每年的第 1 天，1 月 2 日是每年的第 2 天，依此类推。每个月的天数与现行公元纪年法（格里高利历）一致。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/day-of-the-year
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 2021-12-28
 */
public class DayOfTheYear {


    /**
     * jdk自带的Calendar实现
     * @param date
     * @return
     */
    public int getDay(Date date) {
        if (date == null) {
            return 0;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.DAY_OF_YEAR);
    }
    
    /**
     * 人工计算，月份-天数的数组和闰年
     * @param date "2021-01-01"输入格式比较严格
     * @return
     */
    public int dayOfYear(String date) {
        int year=Integer.parseInt(date.subSequence(0, 4)+"");
        int month=Integer.parseInt(date.subSequence(5, 7)+"");
        int day=Integer.parseInt(date.subSequence(8, 10)+"");
        //闰年分为普通闰年和世纪闰年，其判断方法为：公历年份是4的倍数，且不是100的倍数，为普通闰年。
        //公历年份是整百数，且必须是400的倍数才是世纪闰年。
        //归结起来就是通常说的：四年一闰；百年不闰，四百年再闰。
        //闰年是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。
        boolean isRunNian = (year%4==0 && year%100!=0) || (year%400==0);
        //第0，占位，清晰点
        int[] monthDay =new int [] {0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(isRunNian) {
            monthDay[2]=29;
        }
        int theDay =0;
        for(int currentMonth=1;currentMonth<month;currentMonth++) {
            theDay+= monthDay[currentMonth];
        }
        theDay+= day;
        return theDay;
    }


}
